package cn.crawler.app.crown.commons.util;

import org.nutz.lang.Times;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class DateUtil {

    /**
     * 字符串转Date
     *
     * @param s
     * @param pattern
     * @return
     */
    public static Date parseDate(String s, String pattern) {
        try {
            return new SimpleDateFormat(pattern, Locale.US).parse(s);
        } catch (ParseException ignore) {
            return null;
        }
    }

    /**
     * 时区转换。支持冬令时、夏令时计算
     *
     * @param date           初始Date
     * @param initTimeZone   原时区
     * @param expectTimeZone 要转的时区
     * @return Date
     */
    public static String timeZoneConvert(Date date, String initTimeZone, String expectTimeZone) {
        try {
            SimpleDateFormat simpleDate = new SimpleDateFormat(DATE_FORMAT_PATTERN.Y_M_D_H_M_S.PATTERN);
            // 将Date转String
            String dateStr = simpleDate.format(date);
            // 设置时区
            simpleDate.setTimeZone(TimeZone.getTimeZone(initTimeZone));
            // 使Date关联初始时区initTimeZone
            date = simpleDate.parse(dateStr);
            // 设置要转换的时区
            simpleDate.setTimeZone(TimeZone.getTimeZone(expectTimeZone));
            // 通过转换字符串使Date关联要转换的时区expectTimeZone
            return simpleDate.format(date);
        } catch (ParseException e) {
            return null;
        }
    }


    /**
     * 当前时区Date转美东时区DateString
     *
     * @param date
     * @return
     */
    public static String timeZoneConvertEdt(Date date) {
        return DateUtil.timeZoneConvert(date, TimeZone.getDefault().getID(), "America/New_York");
    }


    /**
     * 指定时区时间转系统时区时间
     *
     * @param   timezone 指定时区id
     * @param   time     时间戳(毫秒级)
     * @return  毫秒级
     */
    public static long timeZoneConvertSys(String timezone, long time) {
        String dateStr = timeZoneConvert(new Date(time), timezone, TimeZone.getDefault().getID());
        return Times.ams(dateStr);
    }


    /**
     * 系统时间某天零时的long值
     *
     * @param offset 0(今天零点) +1(明天零点) -1(昨天零点) +2(后天零点) ....
     * @return
     */
    public static long getZeroLong(int offset) {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.add(Calendar.DAY_OF_MONTH, offset);
        return cal.getTime().getTime() / 1000;
    }

    /**
     * 系统时间今日零时
     *
     * @return
     */
    public static long getTodayZeroLong() {
        return getZeroLong(0);
    }

    /**
     * 系统时间昨日零时
     *
     * @return
     */
    public static long getYesterdayZeroLong() {
        return getZeroLong(-1);
    }


    public enum DATE_FORMAT_PATTERN {
        // 2020-01-01 00:00:00
        Y_M_D_H_M_S("yyyy-MM-dd HH:mm:ss"),
        // 2020年01月01日00:00:00
        Y_M_D_H_M_S_CHINESE("yyyy年MM月dd日HH:mm:ss"),
        // 2020-01-01 00:00am
        Y_M_D_H_M_A("yyyy-MM-dd hh:mma");
        public final String PATTERN;

        DATE_FORMAT_PATTERN(String pattern) {
            this.PATTERN = pattern;
        }
    }
}
